Projet "Attente au restaurant"

Le problème:

Le problème de ce projet était de simuler une soirée de restaurant de 4h avec des groupes de clients qui arrivent toutes les deux minutes, les groupes sont composés
de 2 à 6 personnes et chaque groupe reste un temps aléatoire compris entre 60 et 120 minutes. Le restaurant possède 50 tables de 2 donc il peut accueillir jusqu'à 100 personnes,
et il y a la possibilité de combiner plusieurs tables afin qu'un groupe entier puisse être ensemble. Donc pour que de nouveaux clients s'installent il faut qu'il y ait suffisament de
tables disponibles pour l'entiereté du groupe. Les objectifs sont :
-Afficher le nombre de clients en attente et ceux assis à chaque minute
-Afficher le nombre de clients servis lors d'un service et le nombre moyen de clients par table

Résolution du problème:

Pour résoudre ce problème j'ai choisis d'utiliser une file comme structure de donnée. Les groupes sont représenté dans cette file afin que le premier arrivé soit le premier à rentrer
dans le restaurant. Afin de simuler cette soirée j'ai décidé de creer une variable représentant le temps restant initialisée initialement a 240 (min). Ensuite tout le code est situé dans une boucle
while qui fait tourner jusqu'à ce que le temps restant soit égal a 0. De plus a chaque tour de boucle temps restant est décrémenté de 1.

Le code:


from random import randint

class FileDyna:
    def __init__(self):
        self.file = []

    def est_vide(self):
        return len(self.file) == 0

    def enfiler(self, elt):
        self.file.insert(0, elt)

    def defiler(self):
        assert not self.est_vide(), "File vide !"
        return self.file.pop()

    def __len__(self):
	    return len(self.file)

    def dernier(self):
        return self.file[-1]

    def __str__(self):
        return str(self.file)

def f_personnes():
    """
    Sortie: une file de tous les potentiels groupes de clients
    Fonction qui crée une file avec les potentiels clients qui peuvent arriver dans le restaurant
    """
    personnes=FileDyna()
    for i in range(120): #groupe de clients toute les 2min et 4h de service donc 240min donc 240/2=120
        personnes.enfiler([randint(2,6),randint(60,120)])
    return personnes

def attente():
    """
    Sortie: le nombre de clients assis, le nombre de clients en attente chaque minute et le nombre moyen de clients par table
    Fonction qui simule une soirée au restaurant de 4h 
    """
    temps=240
    clients_a=0
    somme=0
    personnes=f_personnes() #Tout les potentiels clients
    tables=[]  #Tableau représentant les tables
    while temps>0:    #Du moment que les 4h ne sont pas écoulées
        if temps%2==0 and not personnes.est_vide() and clients_a+personnes.dernier()[0]<=100:
            n_clients=personnes.defiler()
            tables.append(n_clients)  #Les clients s'assoient
            clients_a+=n_clients[0]   #Le nombre de clients assis augmente
            clients_attente=len(personnes)
            somme+=n_clients[0]
        for groupe in tables:   #Pour chaque groupe assis
            groupe[1]-=1    #On diminue le temps qu'ils leur restent
        i=0
        while i<=len(tables):
            if tables[i][1]<=0: #Si le temps restant d'un groupe atteint 0
                clients_a-=tables[i][0] #Alors le nombre de clients assis diminue
                tables.pop(i)    #Alors on retire le groupe des tables
            else:
                i+=1    #On incrémente i afin de parcourir tout le temps restant de tout les groupes
        temps-=1
        print(' ')
        print("Temps restant: "+ str(temps)+'min')
        print ('Nombre de clients assis:'+ str(clients_a)+' | '+'Groupes de clients en attente:'+ str(clients_attente))
        print("Nombre moyen de clients par table:"+ str(clients_a/50)+' | '+"Nombre moyen de clients par table:"+ str(somme/50)) #En fonction de si on veut la moyenne a chaque minute ou de tout le service
        print("Nombre de clients qui ont pu manger au cours de la soirée " +str(somme))


if __name__=='__main__':
    print(attente())